/**
 * 分页钩子函数，用于处理分页逻辑
 * @param instance - 请求实例对象，需要包含run方法和requestStatus属性
 * @param execute - 是否在组件挂载时自动执行初始化，默认为false
 * @param paramsCallback
 * @returns 包含默认参数、下一页方法和初始化方法的对象
 */
export function usePagination(
    instance: any,
    execute?: boolean,
    paramsCallback?: (defaultParams: AnyObject) => AnyObject
) {
    const defaultParams = {
        page: 1,
        limit: 10
    };

    // 监听触底事件，触发下一页加载
    onReachBottom(() => {
        onNextPage();
    });

    /**
     * 初始化分页请求
     * @param payload
     */
    const onInit = (payload?: AnyObject | undefined) => {
        defaultParams.page = 1;

        const params = {
            ...defaultParams,
            ...payload
        };

        instance.run({
            ...params,
            ...(paramsCallback && paramsCallback(params))
        });
    };

    /**
     * 加载下一页数据
     * @param payload
     */
    const onNextPage = (payload?: AnyObject | undefined) => {
        // 如果正在加载中，则不执行下一页请求
        if (instance.requestStatus.isLoading.value) return;

        defaultParams.page++;

        const params = {
            ...defaultParams,
            ...payload
        };

        instance.run({
            ...params,
            ...(paramsCallback && paramsCallback(params))
        });
    };

    // 如果设置了自动执行，则在组件挂载时初始化
    if (execute) {
        onLoad((e: AnyObject | undefined) => {
            onInit(e);
        });
    }

    return {
        paging: defaultParams,
        onNextPage,
        onInit
    };
}
